import TencentCloudChat from '@tencentcloud/chat';
import {
	genTestUserSig
} from '@/static/js/GenerateTestUserSig.js'
let options = null
let that = null // 初始化接收 vm 实例
export let chat = null
let listening = {}
let defaultFnList = {
	// 收到消息
	messageReceived: ({
		data
	}) => {
		const msg = data[0]
		console.log(msg, 'msgmsgmsgmsg');
		// 取消在机器人处的在线消息展示
		// that.$u.vuex('vuex_online_message_list', [...that.vuex_online_message_list || [], {
		// 	name: msg.nick,
		// 	src: msg.avatar,
		// 	id: msg.ID,
		// 	text: msg.payload.text || msg.payload.description || '',
		// 	time: msg.clientTime * 1000,
		// 	// userID:msg.userID
		// 	from: msg.from
		// }])
		console.log(that.vuex_online_message_list);
		for (let key in listening) {
			const listen = listening[key]
			if (typeof listen === "function") {
				listen(msg)
			}
		}
	},
	// imSDK加载完成
	charSdkReady: () => {
		chatReady = true
		console.log('初始化完毕 我准备好了同志！！！');
		// 初始化完成 设置 用户信息
		chat.getMyProfile().then(res => {
			// if(res.data.nick){ 懒得弄直接更新一波再说
			updateUserInfo({
				nick: that.vuex_user_info.nickName,
				avatar: that.vuex_user_info.avatar,
			})
			// }
		})
		// 收到离线消息和会话列表同步完毕通知，接入侧可以调用 sendMessage 等需要鉴权的接口
		// event.name - TencentCloudChat.EVENT.SDK_READY
	}
}
//处理方法集合
let fnList = {
	...defaultFnList
}
export let chatReady = false
// 初始化
export const txImInit = (vm) => {
	that = vm
	// userID
	const userID = that.vuex_user_info.id
	const appData = {
		SDKAppID: parseInt(that.vuex_app_config.txCloudAppId),
		secretKey: that.vuex_app_config.txCloudAppKey,
	}
	if (chat) {
		if(!chatReady){
			chatLogin(userID, appData).then(res => {
				console.log(res, 'resres');
				console.log(chat.getLoginUser(), '1111');
			
			}).catch(err=>{
				console.log(err,'err');
			})
		}
	} else {
		console.log('初始化------------------------chattttttttttttttttttttt');
		console.log(fnList, 'fnListfnListfnList');
		options = {
			SDKAppID: appData.SDKAppID // 接入时需要将0替换为您的即时通信 IM 应用的 SDKAppID
		};
		// 创建 SDK 实例，`TIM.create()`方法对于同一个 `SDKAppID` 只会返回同一份实例
		chat = TencentCloudChat.create(options); // SDK 实例通常用 chat 表示
		chat.setLogLevel(2); // 普通级别，日志量较多，接入时建议使用
		// chat.setLogLevel(1); // release 级别，SDK 输出关键信息，生产环境时建议使用


		// 监听事件，如：

		chat.on(TencentCloudChat.EVENT.SDK_READY, fnList.charSdkReady);
		// function(event) {
		// 	// 收到推送的单聊、群聊、群提示、群系统通知的新消息，可通过遍历 event.data 获取消息列表数据并渲染到页面
		// 	// event.name - TencentCloudChat.EVENT.MESSAGE_RECEIVED
		// 	// event.data - 存储 Message 对象的数组 - [Message]
		// }
		chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, (res) => {
			console.log('接收到消息--------------------------------------------------');
			fnList.messageReceived(res)
		});

		chat.on(TencentCloudChat.EVENT.MESSAGE_MODIFIED, function(event) {
			// 收到消息被第三方回调修改的通知，消息发送方可通过遍历 event.data 获取消息列表数据并更新页面上同 ID 消息的内容
			// event.name - TencentCloudChat.EVENT.MESSAGE_MODIFIED
			// event.data - 存储被第三方回调修改过的 Message 对象的数组 - [Message]
		});

		chat.on(TencentCloudChat.EVENT.MESSAGE_REVOKED, function(event) {
			// 收到消息被撤回的通知。
			// event.name - TencentCloudChat.EVENT.MESSAGE_REVOKED
			// event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isRevoked 属性值为 true
		});

		chat.on(TencentCloudChat.EVENT.MESSAGE_READ_BY_PEER, function(event) {
			// SDK 收到对端已读消息的通知，即已读回执。
			// event.name - TencentCloudChat.EVENT.MESSAGE_READ_BY_PEER
			// event.data - event.data - 存储 Message 对象的数组 - [Message] - 每个 Message 对象的 isPeerRead 属性值为 true
		});

		chat.on(TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED, function(event) {
			// 收到会话列表更新通知，可通过遍历 event.data 获取会话列表数据并渲染到页面
			// event.name - TencentCloudChat.EVENT.CONVERSATION_LIST_UPDATED
			// event.data - 存储 Conversation 对象的数组 - [Conversation]
		});

		chat.on(TencentCloudChat.EVENT.GROUP_LIST_UPDATED, function(event) {
			// 收到群组列表更新通知，可通过遍历 event.data 获取群组列表数据并渲染到页面
			// event.name - TencentCloudChat.EVENT.GROUP_LIST_UPDATED
			// event.data - 存储 Group 对象的数组 - [Group]
		});

		chat.on(TencentCloudChat.EVENT.PROFILE_UPDATED, function(event) {
			// 收到自己或好友的资料变更通知
			// event.name - TencentCloudChat.EVENT.PROFILE_UPDATED
			// event.data - 存储 Profile 对象的数组 - [Profile]
		});

		chat.on(TencentCloudChat.EVENT.BLACKLIST_UPDATED, function(event) {
			// 收到黑名单列表更新通知
			// event.name - TencentCloudChat.EVENT.BLACKLIST_UPDATED
			// event.data - 存储 userID 的数组 - [userID]
		});

		chat.on(TencentCloudChat.EVENT.SDK_NOT_READY, function(event) {
			chatReady = false
			// 收到 SDK 进入 not ready 状态通知，此时 SDK 无法正常工作
			// event.name - TencentCloudChat.EVENT.SDK_NOT_READY
		});

		chat.on(TencentCloudChat.EVENT.KICKED_OUT, function(event) {
			// 收到被踢下线通知
			// event.name - TencentCloudChat.EVENT.KICKED_OUT
			// event.data.type - 被踢下线的原因，例如 :
			//   - TencentCloudChat.TYPES.KICKED_OUT_MULT_ACCOUNT 多实例登录被踢
			//   - TencentCloudChat.TYPES.KICKED_OUT_MULT_DEVICE 多终端登录被踢
			//   - TencentCloudChat.TYPES.KICKED_OUT_USERSIG_EXPIRED 签名过期被踢
			//   - TencentCloudChat.TYPES.KICKED_OUT_REST_API(REST API kick 接口踢出。)
		});

		chat.on(TencentCloudChat.EVENT.NET_STATE_CHANGE, function(event) {
			// 网络状态发生改变
			// event.name - TencentCloudChat.EVENT.NET_STATE_CHANGE
			// event.data.state 当前网络状态，枚举值及说明如下：
			//   - TencentCloudChat.TYPES.NET_STATE_CONNECTED - 已接入网络
			//   - TencentCloudChat.TYPES.NET_STATE_CONNECTING - 连接中。很可能遇到网络抖动，SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中”
			//   - TencentCloudChat.TYPES.NET_STATE_DISCONNECTED - 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试，若用户网络恢复，SDK 会自动同步消息
		});

		chat.on(TencentCloudChat.EVENT.FRIEND_LIST_UPDATED, function(event) {
			// 收到好友列表更新通知
			// event.name - TencentCloudChat.EVENT.FRIEND_LIST_UPDATED
			// event.data - 存储 Friend 对象的数组 - [Friend]
		});

		chat.on(TencentCloudChat.EVENT.FRIEND_APPLICATION_LIST_UPDATED, function(event) {
			// 收到好友申请列表更新通知
			// event.name - TencentCloudChat.EVENT.FRIEND_APPLICATION_LIST_UPDATED
			// friendApplicationList - 好友申请列表 - [FriendApplication]
			// unreadCount - 好友申请的未读数
			// const { friendApplicationList, unreadCount } = event.data;
			// 发送给我的好友申请（即别人申请加我为好友）
			// const applicationSentToMe = friendApplicationList.filter((friendApplication) => friendApplication.type === TencentCloudChat.TYPES.SNS_APPLICATION_SENT_TO_ME);
			// 我发送出去的好友申请（即我申请加别人为好友）
			// const applicationSentByMe = friendApplicationList.filter((friendApplication) => friendApplication.type === TencentCloudChat.TYPES.SNS_APPLICATION_SENT_BY_ME);
		});

		chat.on(TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED, function(event) {
			// 收到好友分组列表更新通知
			// event.name - TencentCloudChat.EVENT.FRIEND_GROUP_LIST_UPDATED
			// event.data - 存储 FriendGroup 对象的数组 - [FriendGroup]
		});
		// 登录
		chatLogin(userID, appData).then(res => {
			console.log(res, 'resres');
			console.log(chat.getLoginUser(), '1111');

		}).catch(res => {
			console.log(res, 'errrrrerrererererer');

		})

		// // 注册腾讯云即时通信 IM 上传插件
		// chat.registerPlugin({
		// 	'tim-upload-plugin': TIMUploadPlugin
		// });


		// // 注册腾讯云即时通信 IM 本地审核插件
		// chat.registerPlugin({
		// 	'tim-profanity-filter-plugin': TIMProfanityFilterPlugin
		// });


		// 注意！以下代码适用于 uni-app -> native app 项目集成离线推送能力。
		// 应合规要求，在用户同意隐私协议的前提下，登录成功后 SDK 会通过推送插件获取推送 token
		// 并将推送 token 传递至后台（若获取 token 失败则会导致离线推送无法正常使用）
		// const TUIOfflinePush = uni.requireNativePlugin("TencentCloud-TUIOfflinePush");
		// chat.registerPlugin({
		// 	'tim-offline-push-plugin': TUIOfflinePush,
		// 	'offlinePushConfig': {
		// 		// huawei
		// 		'huaweiBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 		// xiaomi
		// 		'xiaomiBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 		'xiaomiAppID': '', // 小米开放平台分配的应用 APPID
		// 		'xiaomiAppKey': '', // 小米开放平台分配的应用 APPKEY
		// 		// meizu
		// 		'meizuBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 		'meizuAppID': '', // 魅族开放平台分配的应用 APPID
		// 		'meizuAppKey': '', // 魅族开放平台分配的应用 APPKEY
		// 		// vivo
		// 		'vivoBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 		// oppo
		// 		'oppoBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 		'oppoAppKey': '', // oppo 开放平台分配的应用 APPID
		// 		'oppoAppSecret': '', // oppo 开放平台分配的应用 Secret
		// 		// ios
		// 		'iosBusinessID': '', // 在腾讯云控制台上传第三方推送证书后分配的证书 ID
		// 	}
		// });
	}

}

/**
 * 向用户发送消息
 * @param {String} userID 用户的userID ， id
 * @param {String} text 发送的消息
 * @param {String} type 类型
 */
export const sendMessageToUser = (userID, data, type) => {
	const option = {
		to: userID,
		conversationType: TencentCloudChat.TYPES.CONV_C2C,
		// 消息优先级，用于群聊。如果某个群的消息超过了频率限制，后台会优先下发高优先级的消息，详细请参考：https://cloud.tencent.com/document/product/269/3663#.E6.B6.88.E6.81.AF.E4.BC.98.E5.85.88.E7.BA.A7.E4.B8.8E.E9.A2.91.E7.8E.87.E6.8E.A7.E5.88.B6)
		// 支持的枚举值：TencentCloudChat.TYPES.MSG_PRIORITY_HIGH, TencentCloudChat.TYPES.MSG_PRIORITY_NORMAL（默认）, TencentCloudChat.TYPES.MSG_PRIORITY_LOW, TencentCloudChat.TYPES.MSG_PRIORITY_LOWEST
		// priority: TencentCloudChat.TYPES.MSG_PRIORITY_NORMAL,
		payload: {
			...data
		},
		// type: type ? TencentCloudChat.TYPES.MSG_CUSTOM : null,
		// 支持C2C消息已读回执功能，如果您发消息需要已读回执，需购买旗舰版套餐，并且创建消息时将 needReadReceipt 设置为 true
		// needReadReceipt: true
		// 消息自定义数据（云端保存，会发送到对端，程序卸载重装后还能拉取到）
		// cloudCustomData: 'your cloud custom data'
	}
	let message
	// 1. 创建消息实例，接口返回的实例可以上屏
	if (type) {

		option.payload = {
			data: JSON.stringify(data),
			description: '分享了一条视频', // 描述信息
			extension: type // 补充说明
		}
		message = chat.createCustomMessage(option);

	} else {
		message = chat.createTextMessage(option);
	}
	// 2. 发送消息
	let promise = chat.sendMessage(message);
	return promise
}
// 更新个人信息
export const updateUserInfo = (data) => {
	let promise = chat.updateMyProfile({
		allowType: TencentCloudChat.TYPES.ALLOW_TYPE_ALLOW_ANY,
		...data
	});
	return promise
}
// 获取好友信息
export const getFriendsInfo = (userIDList) => {
	return chat.getUserProfile({
		userIDList
	});

}
// 获取消息列表
export const getMessageList = (id, nextId) => {
	return chat.getMessageList({
		conversationID: `C2C${id}`,
		nextReqMessageID: nextId
	})
}
export const delMessage = (msgLit) => {
	chat.deleteMessage(msgLit).then(res => {
		that.$u.toast('操作成功')
	})
}
export const setCharReady = (handle) => {
	const fn = fnList.charSdkReady
	fnList.charSdkReady = (data) => {
		fn(data)
		handle(data)
	}
	if (chat) {
		chat.on(TencentCloudChat.EVENT.SDK_READY, fnList.charSdkReady);
	}

}
// 增加监听
export const addListening = (path, cb) => {
	listening[path] = cb
}
// 移除监听
export const delListening = (path, cb) => {
	delete listening[path]
	console.log(listening, 'listeninglistening');
}
// 登录
export const chatLogin = (userID, appData) => {
	const {
		userSig
	} = genTestUserSig({
		...appData,
		userID,
	})
	return chat.login({
		userID,
		userSig
	})
}
// 登出
export const chatLogout = (path, cb) => {
	chat.logout().then(res => {
		console.log('登出chat1111',res);
		// chat = null
	}).catch(err => {
		console.log('登出chat22222',err);
	})
}